package com.xxzb.pack0824.线程池;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;

public class CallableTaskTest1 {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //创建线程任务对象
        CallableTask callableTask = new CallableTask();
        /**
         *创建FutureTask类的实例(未来计算结果类)，并将callableTask任务封装到FutureTask对象中\
         * FutureTask可以对线程进行基本的管理,在Future接口中提供了5个对象线程管理的基本操作:
         *  (1)boolean cancel(boolean var1):取消正在执行的线程,参数为true时取消线程         *
         *  (2)boolean isCancelled():检测线程是否被取消，如果已被取消返回true
         *  (3)boolean isDone():判断一个线程是否执行完成(执行结束)，如果返回true表示已完成(已结束)
         *  (4)V get():获得线程的返回值(实际上是用于获得线程任务的返回值call方法的返回值)         *
         *          - 该方法会让线程进入阻塞状态，等待子线程执行结束，当子线程执行结束后，将结果获取
         *  (5)V get(long var1, TimeUnit var3):获得线程的返回值(实际上是用于获得线程任务的返回值call方法的返回值)
         *          - 该方法会让线程进入阻塞状态，但该方法不会一直傻傻的等下去,它根据参数中设置的时间进行等待，如果等待时间到达
         *          - 还未获取结果，则不在等待
         */
        FutureTask<Integer> futureTask = new FutureTask(callableTask);
        //创建线程对象(Thread)
        Thread t = new Thread(futureTask,"子线程");
        t.start();

        System.out.println("-----------准备取消子线程----------");
        for (int i = 0; i < 100; i++) {
            System.out.println(Thread.currentThread().getName()+":"+i);
            if(i==20){
                futureTask.cancel(true);//取消子线程
                System.out.println("取消线程。。。");
            }
            // TimeUnit.MILLISECONDS.sleep(10);//休眠10毫秒
        }



    }
}
